package com.yupi.springbootinit.manager;

import com.yupi.springbootinit.common.ErrorCode;
import com.yupi.springbootinit.exception.BusinessException;
import org.redisson.api.RRateLimiter;
import org.redisson.api.RateIntervalUnit;
import org.redisson.api.RateType;
import org.redisson.api.RedissonClient;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/*
专门提供RedisLimiter限流基础服务的（提供通用的能力）
RateLimiter 是 Redisson 基于 Redis 实现的分布式限流组件，
底层使用令牌桶算法，能够控制某个操作或服务在一定时间内的请求频率，保护系统不被过多的请求压垮。
 */
@Service
public class RedisLimiterManager {

    @Resource
    private RedissonClient redissonClient;

    /**
     * @param key 区分不同的限流器，比如不同的用片id应该分别统计
     */
    public void doRateLimit(String key) {
        //创建一个名称为rateLimiter的限流器，每2秒最多访问1次
        RRateLimiter rateLimiter = redissonClient.getRateLimiter(key);
        rateLimiter.trySetRate(RateType.OVERALL, 1, 2, RateIntervalUnit.SECONDS);
        //每当个操作来了后，请求一个令牌
        boolean canOp = rateLimiter.tryAcquire(1);
        if (!canOp) {
            throw new BusinessException(ErrorCode.TOO_MANY_REQUEST);
        }
    }
}
